﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

namespace BuildTablesFromPdf.Engine.CMap
{
    public class NameCharacterCollection : List<NameCharacter>
    {
        public readonly static NameCharacterCollection Instance = new NameCharacterCollection();

        private NameCharacterCollection()
        {
            Add("uni00470303", "G̃"[0]);
            Add("uni00670303", "g̃"[0]);
            Add("space", ' ');
            Add("exclam", '!');
            Add("quotedbl", '"');
            Add("numbersign", '#');
            Add("dollar", '$');
            Add("percent", '%');
            Add("ampersand", '&');
            Add("quotesingle", '\'');
            Add("parenleft", '(');
            Add("parenright", ')');
            Add("asterisk", '*');
            Add("plus", '+');
            Add("comma", ',');
            Add("hyphen", '-');
            Add("period", '.');
            Add("slash", '/');
            Add("zero", '0');
            Add("one", '1');
            Add("two", '2');
            Add("three", '3');
            Add("four", '4');
            Add("five", '5');
            Add("six", '6');
            Add("seven", '7');
            Add("eight", '8');
            Add("nine", '9');
            Add("colon", ':');
            Add("semicolon", ';');
            Add("less", '<');
            Add("equal", '=');
            Add("greater", '>');
            Add("question", '?');
            Add("at", '@');
            Add("A", 'A');
            Add("B", 'B');
            Add("C", 'C');
            Add("D", 'D');
            Add("E", 'E');
            Add("F", 'F');
            Add("G", 'G');
            Add("H", 'H');
            Add("I", 'I');
            Add("J", 'J');
            Add("K", 'K');
            Add("L", 'L');
            Add("M", 'M');
            Add("N", 'N');
            Add("O", 'O');
            Add("P", 'P');
            Add("Q", 'Q');
            Add("R", 'R');
            Add("S", 'S');
            Add("T", 'T');
            Add("U", 'U');
            Add("V", 'V');
            Add("W", 'W');
            Add("X", 'X');
            Add("Y", 'Y');
            Add("Z", 'Z');
            Add("bracketleft", '[');
            Add("backslash", '\\');
            Add("bracketright", ']');
            Add("asciicircum", '^');
            Add("underscore", '_');
            Add("grave", '`');
            Add("a", 'a');
            Add("b", 'b');
            Add("c", 'c');
            Add("d", 'd');
            Add("e", 'e');
            Add("f", 'f');
            Add("g", 'g');
            Add("h", 'h');
            Add("i", 'i');
            Add("j", 'j');
            Add("k", 'k');
            Add("l", 'l');
            Add("m", 'm');
            Add("n", 'n');
            Add("o", 'o');
            Add("p", 'p');
            Add("q", 'q');
            Add("r", 'r');
            Add("s", 's');
            Add("t", 't');
            Add("u", 'u');
            Add("v", 'v');
            Add("w", 'w');
            Add("x", 'x');
            Add("y", 'y');
            Add("z", 'z');
            Add("braceleft", '{');
            Add("bar", '|');
            Add("braceright", '}');
            Add("asciitilde", '~');
            Add("uni00A0", ' ');
            Add("exclamdown", '¡');
            Add("cent", '¢');
            Add("sterling", '£');
            Add("currency", '¤');
            Add("yen", '¥');
            Add("brokenbar", '¦');
            Add("section", '§');
            Add("dieresis", '¨');
            Add("copyright", '©');
            Add("ordfeminine", 'ª');
            Add("guillemotleft", '«');
            Add("logicalnot", '¬');
            Add("uni00AD", '­');
            Add("registered", '®');
            Add("macron", '¯');
            Add("degree", '°');
            Add("plusminus", '±');
            Add("twosuperior", '²');
            Add("threesuperior", '³');
            Add("acute", '´');
            Add("uni00B5", 'µ');
            Add("paragraph", '¶');
            Add("periodcentered", '·');
            Add("cedilla", '¸');
            Add("onesuperior", '¹');
            Add("ordmasculine", 'º');
            Add("guillemotright", '»');
            Add("onequarter", '¼');
            Add("onehalf", '½');
            Add("threequarters", '¾');
            Add("questiondown", '¿');
            Add("Agrave", 'À');
            Add("Aacute", 'Á');
            Add("Acircumflex", 'Â');
            Add("Atilde", 'Ã');
            Add("Adieresis", 'Ä');
            Add("Aring", 'Å');
            Add("AE", 'Æ');
            Add("Ccedilla", 'Ç');
            Add("Egrave", 'È');
            Add("Eacute", 'É');
            Add("Ecircumflex", 'Ê');
            Add("Edieresis", 'Ë');
            Add("Igrave", 'Ì');
            Add("Iacute", 'Í');
            Add("Icircumflex", 'Î');
            Add("Idieresis", 'Ï');
            Add("Eth", 'Ð');
            Add("Ntilde", 'Ñ');
            Add("Ograve", 'Ò');
            Add("Oacute", 'Ó');
            Add("Ocircumflex", 'Ô');
            Add("Otilde", 'Õ');
            Add("Odieresis", 'Ö');
            Add("multiply", '×');
            Add("Oslash", 'Ø');
            Add("Ugrave", 'Ù');
            Add("Uacute", 'Ú');
            Add("Ucircumflex", 'Û');
            Add("Udieresis", 'Ü');
            Add("Yacute", 'Ý');
            Add("Thorn", 'Þ');
            Add("germandbls", 'ß');
            Add("agrave", 'à');
            Add("aacute", 'á');
            Add("acircumflex", 'â');
            Add("atilde", 'ã');
            Add("adieresis", 'ä');
            Add("aring", 'å');
            Add("ae", 'æ');
            Add("ccedilla", 'ç');
            Add("egrave", 'è');
            Add("eacute", 'é');
            Add("ecircumflex", 'ê');
            Add("edieresis", 'ë');
            Add("igrave", 'ì');
            Add("iacute", 'í');
            Add("icircumflex", 'î');
            Add("idieresis", 'ï');
            Add("eth", 'ð');
            Add("ntilde", 'ñ');
            Add("ograve", 'ò');
            Add("oacute", 'ó');
            Add("ocircumflex", 'ô');
            Add("otilde", 'õ');
            Add("odieresis", 'ö');
            Add("divide", '÷');
            Add("oslash", 'ø');
            Add("ugrave", 'ù');
            Add("uacute", 'ú');
            Add("ucircumflex", 'û');
            Add("udieresis", 'ü');
            Add("yacute", 'ý');
            Add("thorn", 'þ');
            Add("ydieresis", 'ÿ');
            Add("Amacron", 'Ā');
            Add("amacron", 'ā');
            Add("Abreve", 'Ă');
            Add("abreve", 'ă');
            Add("Aogonek", 'Ą');
            Add("aogonek", 'ą');
            Add("Cacute", 'Ć');
            Add("cacute", 'ć');
            Add("Ccircumflex", 'Ĉ');
            Add("ccircumflex", 'ĉ');
            Add("Cdotaccent", 'Ċ');
            Add("cdotaccent", 'ċ');
            Add("Ccaron", 'Č');
            Add("ccaron", 'č');
            Add("Dcaron", 'Ď');
            Add("dcaron", 'ď');
            Add("Dcroat", 'Đ');
            Add("dcroat", 'đ');
            Add("Emacron", 'Ē');
            Add("emacron", 'ē');
            Add("Ebreve", 'Ĕ');
            Add("ebreve", 'ĕ');
            Add("Edotaccent", 'Ė');
            Add("edotaccent", 'ė');
            Add("Eogonek", 'Ę');
            Add("eogonek", 'ę');
            Add("Ecaron", 'Ě');
            Add("ecaron", 'ě');
            Add("Gcircumflex", 'Ĝ');
            Add("gcircumflex", 'ĝ');
            Add("Gbreve", 'Ğ');
            Add("gbreve", 'ğ');
            Add("Gdotaccent", 'Ġ');
            Add("gdotaccent", 'ġ');
            Add("uni0122", 'Ģ');
            Add("uni0123", 'ģ');
            Add("Hcircumflex", 'Ĥ');
            Add("hcircumflex", 'ĥ');
            Add("Hbar", 'Ħ');
            Add("hbar", 'ħ');
            Add("Itilde", 'Ĩ');
            Add("itilde", 'ĩ');
            Add("Imacron", 'Ī');
            Add("imacron", 'ī');
            Add("Iogonek", 'Į');
            Add("iogonek", 'į');
            Add("Idotaccent", 'İ');
            Add("dotlessi", 'ı');
            Add("Jcircumflex", 'Ĵ');
            Add("jcircumflex", 'ĵ');
            Add("uni0136", 'Ķ');
            Add("uni0137", 'ķ');
            Add("kgreenlandic", 'ĸ');
            Add("Lacute", 'Ĺ');
            Add("lacute", 'ĺ');
            Add("uni013B", 'Ļ');
            Add("uni013C", 'ļ');
            Add("Lcaron", 'Ľ');
            Add("lcaron", 'ľ');
            Add("Ldot", 'Ŀ');
            Add("ldot", 'ŀ');
            Add("Lslash", 'Ł');
            Add("lslash", 'ł');
            Add("Nacute", 'Ń');
            Add("nacute", 'ń');
            Add("uni0145", 'Ņ');
            Add("uni0146", 'ņ');
            Add("Ncaron", 'Ň');
            Add("ncaron", 'ň');
            Add("napostrophe", 'ŉ');
            Add("Omacron", 'Ō');
            Add("omacron", 'ō');
            Add("Ohungarumlaut", 'Ő');
            Add("ohungarumlaut", 'ő');
            Add("OE", 'Œ');
            Add("oe", 'œ');
            Add("Racute", 'Ŕ');
            Add("racute", 'ŕ');
            Add("uni0156", 'Ŗ');
            Add("uni0157", 'ŗ');
            Add("Rcaron", 'Ř');
            Add("rcaron", 'ř');
            Add("Sacute", 'Ś');
            Add("sacute", 'ś');
            Add("Scircumflex", 'Ŝ');
            Add("scircumflex", 'ŝ');
            Add("uni015E", 'Ş');
            Add("uni015F", 'ş');
            Add("Scaron", 'Š');
            Add("scaron", 'š');
            Add("uni0162", 'Ţ');
            Add("uni0163", 'ţ');
            Add("Tcaron", 'Ť');
            Add("tcaron", 'ť');
            Add("Utilde", 'Ũ');
            Add("utilde", 'ũ');
            Add("Umacron", 'Ū');
            Add("umacron", 'ū');
            Add("Ubreve", 'Ŭ');
            Add("ubreve", 'ŭ');
            Add("Uring", 'Ů');
            Add("uring", 'ů');
            Add("Uhungarumlaut", 'Ű');
            Add("uhungarumlaut", 'ű');
            Add("Uogonek", 'Ų');
            Add("uogonek", 'ų');
            Add("Wcircumflex", 'Ŵ');
            Add("wcircumflex", 'ŵ');
            Add("Ycircumflex", 'Ŷ');
            Add("ycircumflex", 'ŷ');
            Add("Ydieresis", 'Ÿ');
            Add("Zacute", 'Ź');
            Add("zacute", 'ź');
            Add("Zdotaccent", 'Ż');
            Add("zdotaccent", 'ż');
            Add("Zcaron", 'Ž');
            Add("zcaron", 'ž');
            Add("uni018F", 'Ə');
            Add("florin", 'ƒ');
            Add("Ohorn", 'Ơ');
            Add("ohorn", 'ơ');
            Add("Uhorn", 'Ư');
            Add("uhorn", 'ư');
            Add("uni01CD", 'Ǎ');
            Add("uni01CE", 'ǎ');
            Add("uni01CF", 'Ǐ');
            Add("uni01D0", 'ǐ');
            Add("uni01D1", 'Ǒ');
            Add("uni01D2", 'ǒ');
            Add("uni01D3", 'Ǔ');
            Add("uni01D4", 'ǔ');
            Add("uni01D5", 'Ǖ');
            Add("uni01D6", 'ǖ');
            Add("uni01D7", 'Ǘ');
            Add("uni01D8", 'ǘ');
            Add("uni01D9", 'Ǚ');
            Add("uni01DA", 'ǚ');
            Add("uni01DB", 'Ǜ');
            Add("uni01DC", 'ǜ');
            Add("Gcaron", 'Ǧ');
            Add("gcaron", 'ǧ');
            Add("uni0218", 'Ș');
            Add("uni0219", 'ș');
            Add("uni021A", 'Ț');
            Add("uni021B", 'ț');
            Add("uni0237", 'ȷ');
            Add("uni0251", 'ɑ');
            Add("uni0259", 'ə');
            Add("uni0261", 'ɡ');
            Add("uni02BB", 'ʻ');
            Add("uni02BC", 'ʼ');
            Add("uni02BE", 'ʾ');
            Add("uni02BF", 'ʿ');
            Add("circumflex", 'ˆ');
            Add("caron", 'ˇ');
            Add("uni02C8", 'ˈ');
            Add("uni02C9", 'ˉ');
            Add("uni02CA", 'ˊ');
            Add("uni02CB", 'ˋ');
            Add("uni02CC", 'ˌ');
            Add("breve", '˘');
            Add("dotaccent", '˙');
            Add("ring", '˚');
            Add("ogonek", '˛');
            Add("tilde", '˜');
            Add("hungarumlaut", '˝');
            Add("gravecomb", '̀');
            Add("acutecomb", '́');
            Add("uni0302", '̂');
            Add("tildecomb", '̃');
            Add("uni0304", '̄');
            Add("uni0306", '̆');
            Add("uni0307", '̇');
            Add("uni0308", '̈');
            Add("hookabovecomb", '̉');
            Add("uni030A", '̊');
            Add("uni030B", '̋');
            Add("uni030C", '̌');
            Add("uni031B", '̛');
            Add("dotbelowcomb", '̣');
            Add("uni0324", '̤');
            Add("uni0326", '̦');
            Add("uni0327", '̧');
            Add("uni0328", '̨');
            Add("uni032E", '̮');
            Add("uni0331", '̱');
            Add("pi", 'π');
            Add("uni1E0C", 'Ḍ');
            Add("uni1E0D", 'ḍ');
            Add("uni1E0E", 'Ḏ');
            Add("uni1E0F", 'ḏ');
            Add("uni1E20", 'Ḡ');
            Add("uni1E21", 'ḡ');
            Add("uni1E24", 'Ḥ');
            Add("uni1E25", 'ḥ');
            Add("uni1E2A", 'Ḫ');
            Add("uni1E2B", 'ḫ');
            Add("uni1E36", 'Ḷ');
            Add("uni1E37", 'ḷ');
            Add("uni1E38", 'Ḹ');
            Add("uni1E39", 'ḹ');
            Add("uni1E3A", 'Ḻ');
            Add("uni1E3B", 'ḻ');
            Add("uni1E42", 'Ṃ');
            Add("uni1E43", 'ṃ');
            Add("uni1E44", 'Ṅ');
            Add("uni1E45", 'ṅ');
            Add("uni1E46", 'Ṇ');
            Add("uni1E47", 'ṇ');
            Add("uni1E48", 'Ṉ');
            Add("uni1E49", 'ṉ');
            Add("uni1E5A", 'Ṛ');
            Add("uni1E5B", 'ṛ');
            Add("uni1E5C", 'Ṝ');
            Add("uni1E5D", 'ṝ');
            Add("uni1E5E", 'Ṟ');
            Add("uni1E5F", 'ṟ');
            Add("uni1E60", 'Ṡ');
            Add("uni1E61", 'ṡ');
            Add("uni1E62", 'Ṣ');
            Add("uni1E63", 'ṣ');
            Add("uni1E6C", 'Ṭ');
            Add("uni1E6D", 'ṭ');
            Add("uni1E6E", 'Ṯ');
            Add("uni1E6F", 'ṯ');
            Add("Wgrave", 'Ẁ');
            Add("wgrave", 'ẁ');
            Add("Wacute", 'Ẃ');
            Add("wacute", 'ẃ');
            Add("Wdieresis", 'Ẅ');
            Add("wdieresis", 'ẅ');
            Add("uni1E8E", 'Ẏ');
            Add("uni1E8F", 'ẏ');
            Add("uni1E92", 'Ẓ');
            Add("uni1E93", 'ẓ');
            Add("uni1E97", 'ẗ');
            Add("uni1E9E", 'ẞ');
            Add("uni1EA0", 'Ạ');
            Add("uni1EA1", 'ạ');
            Add("uni1EA2", 'Ả');
            Add("uni1EA3", 'ả');
            Add("uni1EA4", 'Ấ');
            Add("uni1EA5", 'ấ');
            Add("uni1EA6", 'Ầ');
            Add("uni1EA7", 'ầ');
            Add("uni1EA8", 'Ẩ');
            Add("uni1EA9", 'ẩ');
            Add("uni1EAA", 'Ẫ');
            Add("uni1EAB", 'ẫ');
            Add("uni1EAC", 'Ậ');
            Add("uni1EAD", 'ậ');
            Add("uni1EAE", 'Ắ');
            Add("uni1EAF", 'ắ');
            Add("uni1EB0", 'Ằ');
            Add("uni1EB1", 'ằ');
            Add("uni1EB2", 'Ẳ');
            Add("uni1EB3", 'ẳ');
            Add("uni1EB4", 'Ẵ');
            Add("uni1EB5", 'ẵ');
            Add("uni1EB6", 'Ặ');
            Add("uni1EB7", 'ặ');
            Add("uni1EB8", 'Ẹ');
            Add("uni1EB9", 'ẹ');
            Add("uni1EBA", 'Ẻ');
            Add("uni1EBB", 'ẻ');
            Add("uni1EBC", 'Ẽ');
            Add("uni1EBD", 'ẽ');
            Add("uni1EBE", 'Ế');
            Add("uni1EBF", 'ế');
            Add("uni1EC0", 'Ề');
            Add("uni1EC1", 'ề');
            Add("uni1EC2", 'Ể');
            Add("uni1EC3", 'ể');
            Add("uni1EC4", 'Ễ');
            Add("uni1EC5", 'ễ');
            Add("uni1EC6", 'Ệ');
            Add("uni1EC7", 'ệ');
            Add("uni1EC8", 'Ỉ');
            Add("uni1EC9", 'ỉ');
            Add("uni1ECA", 'Ị');
            Add("uni1ECB", 'ị');
            Add("uni1ECC", 'Ọ');
            Add("uni1ECD", 'ọ');
            Add("uni1ECE", 'Ỏ');
            Add("uni1ECF", 'ỏ');
            Add("uni1ED0", 'Ố');
            Add("uni1ED1", 'ố');
            Add("uni1ED2", 'Ồ');
            Add("uni1ED3", 'ồ');
            Add("uni1ED4", 'Ổ');
            Add("uni1ED5", 'ổ');
            Add("uni1ED6", 'Ỗ');
            Add("uni1ED7", 'ỗ');
            Add("uni1ED8", 'Ộ');
            Add("uni1ED9", 'ộ');
            Add("uni1EDA", 'Ớ');
            Add("uni1EDB", 'ớ');
            Add("uni1EDC", 'Ờ');
            Add("uni1EDD", 'ờ');
            Add("uni1EDE", 'Ở');
            Add("uni1EDF", 'ở');
            Add("uni1EE0", 'Ỡ');
            Add("uni1EE1", 'ỡ');
            Add("uni1EE2", 'Ợ');
            Add("uni1EE3", 'ợ');
            Add("uni1EE4", 'Ụ');
            Add("uni1EE5", 'ụ');
            Add("uni1EE6", 'Ủ');
            Add("uni1EE7", 'ủ');
            Add("uni1EE8", 'Ứ');
            Add("uni1EE9", 'ứ');
            Add("uni1EEA", 'Ừ');
            Add("uni1EEB", 'ừ');
            Add("uni1EEC", 'Ử');
            Add("uni1EED", 'ử');
            Add("uni1EEE", 'Ữ');
            Add("uni1EEF", 'ữ');
            Add("uni1EF0", 'Ự');
            Add("uni1EF1", 'ự');
            Add("Ygrave", 'Ỳ');
            Add("ygrave", 'ỳ');
            Add("uni1EF4", 'Ỵ');
            Add("uni1EF5", 'ỵ');
            Add("uni1EF6", 'Ỷ');
            Add("uni1EF7", 'ỷ');
            Add("uni1EF8", 'Ỹ');
            Add("uni1EF9", 'ỹ');
            Add("uni2007", ' ');
            Add("uni2010", '‐');
            Add("figuredash", '‒');
            Add("endash", '–');
            Add("emdash", '—');
            Add("uni2015", '―');
            Add("quoteleft", '‘');
            Add("quoteright", '’');
            Add("quotesinglbase", '‚');
            Add("quotedblleft", '“');
            Add("quotedblright", '”');
            Add("quotedblbase", '„');
            Add("dagger", '†');
            Add("daggerdbl", '‡');
            Add("bullet", '•');
            Add("ellipsis", '…');
            Add("perthousand", '‰');
            Add("uni2032", '′');
            Add("uni2033", '″');
            Add("guilsinglleft", '‹');
            Add("guilsinglright", '›');
            Add("fraction", '⁄');
            Add("zero.superior", '⁰');
            Add("four.superior", '⁴');
            Add("five.superior", '⁵');
            Add("six.superior", '⁶');
            Add("seven.superior", '⁷');
            Add("eight.superior", '⁸');
            Add("nine.superior", '⁹');
            Add("parenleft.superior", '⁽');
            Add("parenright.superior", '⁾');
            Add("n.superior", 'ⁿ');
            Add("zero.inferior", '₀');
            Add("one.inferior", '₁');
            Add("two.inferior", '₂');
            Add("three.inferior", '₃');
            Add("four.inferior", '₄');
            Add("five.inferior", '₅');
            Add("six.inferior", '₆');
            Add("seven.inferior", '₇');
            Add("eight.inferior", '₈');
            Add("nine.inferior", '₉');
            Add("parenleft.inferior", '₍');
            Add("parenright.inferior", '₎');
            Add("colonmonetary", '₡');
            Add("lira", '₤');
            Add("uni20A6", '₦');
            Add("peseta", '₧');
            Add("dong", '₫');
            Add("Euro", '€');
            Add("uni20B1", '₱');
            Add("uni20B2", '₲');
            Add("uni20B5", '₵');
            Add("uni20B9", '₹');
            Add("uni20BA", '₺');
            Add("uni20BD", '₽');
            Add("uni2113", 'ℓ');
            Add("uni2117", '℗');
            Add("uni2120", '℠');
            Add("trademark", '™');
            Add("uni2126", 'Ω');
            Add("estimated", '℮');
            Add("onethird", '⅓');
            Add("twothirds", '⅔');
            Add("oneeighth", '⅛');
            Add("threeeighths", '⅜');
            Add("fiveeighths", '⅝');
            Add("seveneighths", '⅞');
            Add("uni2190", '←');
            Add("arrowup", '↑');
            Add("uni2192", '→');
            Add("arrowdown", '↓');
            Add("partialdiff", '∂');
            Add("uni2206", '∆');
            Add("product", '∏');
            Add("summation", '∑');
            Add("minus", '−');
            Add("uni2215", '∕');
            Add("uni2219", '∙');
            Add("radical", '√');
            Add("infinity", '∞');
            Add("integral", '∫');
            Add("approxequal", '≈');
            Add("notequal", '≠');
            Add("lessequal", '≤');
            Add("greaterequal", '≥');
            Add("uni25A0", '■');
            Add("uni25B2", '▲');
            Add("uni25B3", '△');
            Add("uni25B6", '▶');
            Add("uni25B7", '▷');
            Add("uni25BC", '▼');
            Add("uni25BD", '▽');
            Add("uni25C0", '◀');
            Add("uni25C1", '◁');
            Add("uni25C6", '◆');
            Add("lozenge", '◊');
            Add("fi", 'ﬁ');
            Add("fl", 'ﬂ');



        }

        public NameCharacter Add(string name, char character)
        {
            var find = this.SingleOrDefault(_ => _.Name == name);
            if (find != null)
            {
                Console.WriteLine("Duplicate character {0}", name);
                return null;
            }

            NameCharacter nameCharacter = new NameCharacter() {Name = name, Character = character};
            Add(nameCharacter);
            return nameCharacter;
        }

        public NameCharacter Find(string name)
        {
            var find = this.SingleOrDefault(_ => _.Name == name);
            if (find == null)
            {
                if (name.StartsWith("uni"))
                {
                    string value = name.Substring(3);
                    int character;
                    if (int.TryParse(value, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out character))
                        return Add(name, Convert.ToChar(character));
                    else
                        throw new ArgumentException(string.Format("Wrong hex character {0}", name), "name");
                }
                if (name.StartsWith("u"))
                {
                    string value = name.Substring(1);
                    int character;
                    if (int.TryParse(value, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out character))
                        return Add(name, Convert.ToChar(character));
                    else
                        throw new ArgumentException(string.Format("Wrong hex character {0}", name), "name");
                }
                System.Diagnostics.Debug.WriteLine(string.Format("Character {0} not found", name), "name");
                return Add(name, '?');
            }
            return find;
        }

    }
}
